##########################
# 难度预测 模糊匹配
# 输入：单条Json格式的Input_Data，见test_difficulty_predict中的格式
# 输出：难度数值
# --------
# Program Begin
# --------
# 对每一个内容类别都找到对应的初始值，做一个list或者是字典,取类别中所有INCIDENT的难度做平均（四舍五入）
# 先做语句与库中所有字串的模糊匹配，得出一个Bool值，return bool_result(最好能有一个精准度)
#
# 如果没匹配到，则在传入的Json中找内容类别，与库中的类别做匹配
# if bool_result is false:
#    # 如果在库中找到了对应的内容类别，直接返回对应类别的default值
#    if content_classification is found:
#        return 对应类别的default值（注意四舍五入）
#    # 如果在库中未找到对应的内容类别，直接返回预定的1.0初始值
#    else:
#        return 预定的default值  1.0
# 如果匹配到，直接赋值输出
# else:
#     直接将难度库对应的Difficulty数据赋值给result
# --------
# Program End
# --------
# 模糊匹配is_matched方法
# 设置一定的容错率: match_party长度1或2，全匹配；长度3或4，错1；长度5或6，错2；长度7或8，错3
# 输入：match_party：热线内容
#      key_word：匹配到的类别关键词
# 方法 is_matched：在 key_word 内逐个正则.*模糊匹配，比如匹配‘经常断停水’：‘.*断停水’，‘经.*停水’，‘经常.*水’，···
# 输出(返回)：True或False（是否匹配到）
##########################
import json
import re
from config import XINFANG_DIFFICULTY_LIBRARY, doc_dict_dir


class Predict:
    # 对每一个内容类别都找到对应的初始值，做一个list或者是字典,取类别中所有INCIDENT的难度做平均
    # 解析Json数据
    def is_matched(key_word, match_party):
        # start = time.time()
        flag = False
        # match = None
        # 完全匹配key_word的情况
        if re.search(key_word, match_party):
            flag = True
            # match = key_word
            # return flag, match, time.time() - start
            return flag
        # 不能完全匹配key_word，有容错的情况
        else:
            del_num = int(len(key_word) / 2.1)  # 容错or删掉的字符个数
            for idx in range(len(key_word) - del_num + 1):
                re_key_word = key_word[:idx] + '.*' + key_word[idx + del_num:]  # 正则化查找的字符串
                # print(re_key_word)
                match = re.search(re_key_word, match_party)
                if match is not None:
                    flag = True
                    # match = match.group()
                    # return flag, match, time.time() - start
                    return flag
        return flag

    def get_result(param, difficulty_library):
        DIFFICULTY_LIBRARY = difficulty_library
        Bool = False
        # Difficulty_Library_Key_List = []
        # sentence是用户输入的句子
        sentence = param[0]['keyword'][0]['name']
        # print(sentence)
        with open(DIFFICULTY_LIBRARY, "r+", encoding="utf-8") as f:
            list_0 = json.load(f)
            # print(len(list_0))
            # print(len(list_0[1]['keyword']))
            # 难度库DIFFICULTY_LIBRARY整体为一个列表。取list_0中每一个元素的keyword中对应的每一个name对应的值，即incident事件
            # 此处应该想想如何优化，才能提高速度！！
            # 此处应该想想如何优化，才能提高速度！！
            # 此处应该想想如何优化，才能提高速度！！
            # 使用二叉树？
            for i in range(len(list_0)):
                for j in range(len(list_0[i]['keyword'])):
                    keyword = list_0[i]['keyword'][j]['name']
                    # print(keyword)
                    Bool = Predict.is_matched(keyword, sentence)
                    # print(Bool)
                    #####################
                    # 这里需要看看是否要判断type类型
                    #####################
                    if Bool == True and list_0[i]['type'].split("_")[0] == param[0]['type'].split("_")[0]:
                    #
                    # if Bool == True:
                        # print("已找到对应的INCIDENT，难度为： ", list_0[i]['keyword'][j]['level'])
                        result = list_0[i]['keyword'][j]['level']
                        return result
                        # break
                else:
                    continue

                    # break

            # 如果没匹配到，则在传入的Json中找内容类别，与库中的做匹配
            if Bool == False:
                # list_0是难度库
                bool_2 = False
                for i in range(len(list_0)):
                    # 如果两个type相等
                    if list_0[i]['type'] == param[0]['type']:
                        # print("未找到对应INCIDENT,但找到对应的type,该Type的平均难度：", list_0[i]['type_score'])
                        bool_2 = True
                        result = list_0[i]['type_score']
                        return result
                        # break
                if bool_2 == False:
                    # print("新type和INCIDENT,默认值1.0")
                    result = 2
                    return result
        # f.close()
